package com.tth.learn.addproperties.exer;

import java.util.concurrent.locks.ReentrantLock;

/**
 * 线程同步练习题：
 * 银行有一个账户。
 * 有两个储户分别向同一个账户存3000元，每次存1000，存3次。每次存完打印账户余额
 *
 * @Author tth
 * @Date 2022/11/1 17:34
 */
public class AccountTest {
    public static void main(String[] args) {
        Account account = new Account();

        Thread t1 = new Thread(account);
        t1.setName("用户1");

        Thread t2 = new Thread(account);
        t2.setName("用户2");

        t1.start();
        t2.start();
    }
}

/**
 * 使用Lock的方式解决线程安全问题
 */
class Account implements Runnable {
    // 账户余额
    private double balance = 0;
    private ReentrantLock lock = new ReentrantLock();

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            try {
                //加锁
                lock.lock();
                balance += 1000;
                System.out.println(Thread.currentThread().getName() + "存钱，余额为：" + balance);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } finally {
                // 释放锁
                lock.unlock();
            }
        }
    }
}

/**
 * 使用同步代码块的方式解决线程安全问题
 */
//class Account implements Runnable {
//    // 账户余额
//    private double balance = 0;
//    @Override
//    public void run() {
//        for (int i = 0; i < 3; i++) {
//            synchronized (this) {
//                balance += 1000;
//                System.out.println(Thread.currentThread().getName() + "存钱，余额为：" + balance);
//            }
//            try {
//                Thread.sleep(100);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
//    }
//}
